package vip.liux.contracts.infrastructure.messaging;

import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.support.AbstractSubscribableChannel;

import java.util.Set;

/**
 * 广播通道装饰器类，用于扩展现有的 AbstractSubscribableChannel 实现广播功能。
 */
public class BroadcastChannelDecorator extends AbstractSubscribableChannel {

    private static final Logger logger = LoggerFactory.getLogger(BroadcastChannelDecorator.class);

    // 被装饰的 AbstractSubscribableChannel 实例
    private final AbstractSubscribableChannel delegate;

    /**
     * 构造方法，接收一个 AbstractSubscribableChannel 实例。
     *
     * @param delegate 被装饰的通道
     */
    public BroadcastChannelDecorator(AbstractSubscribableChannel delegate) {
        this.delegate = delegate;
    }

    /**
     * 覆盖 sendInternal 方法，实现消息广播到所有订阅者。
     *
     * @param message 消息对象
     * @param timeout 超时时间
     * @return 是否成功发送
     */
    @Override
    protected boolean sendInternal(@NotNull Message<?> message, long timeout) {
        // 获取所有订阅者
        Set<MessageHandler> subscribers = delegate.getSubscribers();
        for (MessageHandler subscriber : subscribers) {
            try {
                // 将消息发送给每个订阅者
                subscriber.handleMessage(message);
            } catch (Exception e) {
                // 捕获并记录单个订阅者的异常，避免影响其他订阅者
                logger.error("Error sending message to subscriber: {}", subscriber, e);
            }
        }
        return true;
    }
}